function PolylineTrailLinkMaterialProperty(
  color,
  duration
) {
  this._definitionChanged = new Cesium.Event()
  this._color = undefined
  this._colorSubscription = undefined
  this.color = color
  this.duration = duration
  this._time = new Date().getTime()
}

Object.defineProperties(
  PolylineTrailLinkMaterialProperty.prototype,
  {
    isConstant: {
      get: function () {
        return false
      }
    },
    definitionChanged: {
      get: function () {
        return this._definitionChanged
      }
    },
    color: Cesium.createPropertyDescriptor('color')
  }
)
PolylineTrailLinkMaterialProperty.prototype.getType =
  function (time) {
    return 'PolylineTrailLink'
  }
PolylineTrailLinkMaterialProperty.prototype.getValue =
  function (time, result) {
    if (!Cesium.defined(result)) {
      result = {}
    }
    result.color = Cesium.Property.getValueOrClonedDefault(
      this._color,
      time,
      Cesium.Color.WHITE,
      result.color
    )
    result.image = Cesium.Material.PolylineTrailLinkImage
    result.time =
      ((new Date().getTime() - this._time) %
        this.duration) /
      this.duration
    return result
  }
PolylineTrailLinkMaterialProperty.prototype.equals =
  function (other) {
    return (
      this === other ||
      (other instanceof PolylineTrailLinkMaterialProperty &&
        Property.equals(this._color, other._color))
    )
  }
Cesium.PolylineTrailLinkMaterialProperty =
  PolylineTrailLinkMaterialProperty
Cesium.Material.PolylineTrailLinkType = 'PolylineTrailLink'
Cesium.Material.PolylineTrailLinkImage = './water_line.gif'
Cesium.Material.PolylineTrailLinkSource = `
    uniform vec4 color;
    uniform float time;
    uniform sampler2D image;
    czm_material czm_getMaterial(czm_materialInput materialInput)
    {
      czm_material material = czm_getDefaultMaterial(materialInput);
      vec2 st = materialInput.st;
      vec4 colorImage = texture2D(image, vec2(fract(st.s*5.0-time*1.0), st.t));
      material.alpha = colorImage.a * color.a;
      material.diffuse = colorImage.rgb;
      return material;
    }`
Cesium.Material._materialCache.addMaterial(
  Cesium.Material.PolylineTrailLinkType,
  {
    fabric: {
      type: Cesium.Material.PolylineTrailLinkType,
      uniforms: {
        color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),
        image: Cesium.Material.PolylineTrailLinkImage,
        time: 0,
        repeat: 3
      },
      source: Cesium.Material.PolylineTrailLinkSource
    },
    translucent: function (material) {
      return true
    }
  }
)
